#pragma once
#include <string>
#include <functional>
#include <iostream>
#include <pthread.h>
// using fun_t = std::function<void()>;

// class Thread
// {
// public:
//     Thread(const std::string &threadname, fun_t f)
//         :_tid(0), _threadname(threadname), _f(f), _isrunning(false)
//     {
//     }

//     static void *ThreadRountinue(void *args)
//     {
//         // if(args==nullptr)
//         //     return nullptr;
//         // (void)args; // 防止编译器告警
//         Thread *ts = static_cast<Thread *>(args);

//         ts->_f();

//         return nullptr;
//     }

//     bool Start()
//     {
//         // if (_isrunning == true)
//         //     return true;
//         int n = pthread_create(&_tid, nullptr, ThreadRountinue, this);
//         if (n == 0)
//         {
//             _isrunning = true;
//             return true;
//         }
//         return false;
//     }
//     bool Join()
//     {
//         if (!_isrunning)
//             return true;
//         int n = pthread_join(_tid, nullptr);
//         if (n == 0)
//         {
//             _isrunning = false;
//             return true;
//         }
//         return false;
//     }

//     bool IsRunning()
//     {
//         return _isrunning;
//     }

//     std::string ThreadName()
//     {
//         return _threadname;
//     }
//     ~Thread(){}

// private:
//     fun_t _f;   // 用户传入的回调  ？？？ /*有问题的*/ 1.
//     pthread_t _tid;
//     std::string _threadname; // 线程名
   
//     bool _isrunning;         
// };







template<class T>
using fun_t = std::function<void(T)>;

template<class T>
class Thread
{
public:
    Thread(const std::string &threadname, fun_t<T> f,T data)
        :_tid(0), _threadname(threadname), _f(f), _isrunning(false),_data(data)
    {
    }

    static void *ThreadRountinue(void *args)
    {
        // if(args==nullptr)
        //     return nullptr;
        // (void)args; // 防止编译器告警
        Thread *ts = static_cast<Thread *>(args);

        ts->_f(ts->_data);

        return nullptr;
    }

    bool Start()
    {
        // if (_isrunning == true)
        //     return true;
        int n = pthread_create(&_tid, nullptr, ThreadRountinue, this);
        if (n == 0)
        {
            _isrunning = true;
            return true;
        }
        return false;
    }
    bool Join()
    {
        if (!_isrunning)
            return true;
        int n = pthread_join(_tid, nullptr);
        if (n == 0)
        {
            _isrunning = false;
            return true;
        }
        return false;
    }

    bool IsRunning()
    {
        return _isrunning;
    }

    std::string ThreadName()
    {
        return _threadname;
    }
    ~Thread(){}

private:
    pthread_t _tid;
    std::string _threadname; // 线程名
    fun_t<T> _f;   // 用户传入的回调
    bool _isrunning;         
    T _data;
};


